module UART2BRAM_TOP (
    // 顶层模块接口
    input wire clk_in,           // 50MHz时钟
    // input wire rst_in,           // 高电平有效 低电平不复位
    input wire sin,              // 串行输入
    input wire read_ack,         // 读完成信号
    
    // Block Memory Generator接口
    output wire [3:0]  bram_we,    // BRAM写使能
    output wire [31:0] bram_addr,  // BRAM地址
    output wire [31:0] bram_din,   // BRAM数据输入
    output wire        bram_en,     // BRAM使能
    output wire        bram_rst_n,
    // output wire        bram_clk,
    output wire        all_data_valid,    // 所有320字节数据接收完成
    
    // 调试信号（可选）
    output wire [7:0]  sdata_debug,      // 接收数据调试输出
    output wire        data_valid_debug, // 数据有效调试输出
    output wire        parity_valid_debug // 奇校验调试输出
);

    // 内部连线声明
    wire [7:0] sdata_internal;
    wire data_valid_internal;
    wire parity_valid_internal;
    wire rst_n_out;     // 复位信号取反后输出

    // UART接收器实例化
    uart_receiver u_uart_receiver (
        .clk_in(clk_in),           // 连接到顶层时钟
        // .rst_n(rst_n_out),                 // 连接到顶层复位
        .sin(sin),                 // 连接到顶层串行输入
        .sdata(sdata_internal),    // 输出数据连接到内部信号
        .data_valid(data_valid_internal),  // 数据有效标志
        .parity_valid(parity_valid_internal) // 奇校验结果
    );

    // BRAM写入控制器实例化
    BMG_Write u_bmg_write (
        // .rst_n(rst_n_out),                 // 连接到顶层复位
        .clk_in(clk_in),           // 连接到顶层时钟
        .flag(data_valid_internal), // 数据有效标志作为写使能
        .sdata_in(sdata_internal), // 接收到的数据作为输入
        .read_ack(read_ack), // BRAM读完成信号
        
        // Block Memory Generator接口
        .bram_we(bram_we),         // BRAM写使能输出
        .bram_addr(bram_addr),     // BRAM地址输出
        .bram_din(bram_din),       // BRAM数据输入输出
        .bram_en(bram_en),         // BRAM使能输出
        .bram_rst_n(bram_rst_n),       // BRAM复位输出
        // .bram_clk(bram_clk),       // BRAM时钟输出
        .all_data_valid(all_data_valid) // 所有数据接收完成标志
    );

    // 复位信号处理
    // assign rst_n_out = ~rst_in;

    // 调试信号连接（可选）
    assign sdata_debug = sdata_internal;
    assign data_valid_debug = data_valid_internal;
    assign parity_valid_debug = parity_valid_internal;
    

endmodule
